//深度遍历ast
//新增一个context，为后续埋伏笔！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！
function traverserNode(ast, context) {
    //直接修改原始数据？？感觉不大好
    const currentNode = ast;
    //context.nodeTransforms是一个数组，其中的每一个元素都是一个函数
    const transforms = context.nodeTransforms;
    // //对当前节点进行操作
    // if (currentNode.type == "Element" && currentNode.tag == "p") {
    //     //见所有的p标签转换成"h1";
    //     currentNode.tag = "h1";
    // }
    // //如果节点的类型为Text
    // //重复内容两次
    // if (currentNode.type === "Text") {
    //     currentNode.content = currentNode.content.repeat(2);
    // }
    //把原来的具体操作内容抽象出去
    for (let i = 0; i < transforms.length; i++) {
        transforms[i](currentNode, context);
    }

    //如果有子节点，则递归地调用traverseNode函数进行遍历
    const children = currentNode.children;
    if (children) {
        for (let i = 0; i < children.length; i++) {
            traverserNode(children[i], context);
        }
    }
}
//标签替换转换
function transformElement(node) {
    if (node.type == "Element" && node.tag == "p") {
        //见所有的p标签转换成"h1";
        node.tag = "h1";
    }
}
//文本替换转换
function transformText(node) {
    if (node.type === "Text") {
        node.content = node.content.repeat(2);
    }
}

//封装transform函数，来对AST进行转换
function transform(ast) {
    const context = {
        nodeTransforms: [transformElement, transformText],
    };
    traverserNode(ast, context);
    console.log(dump(ast));
}